<?php

declare (strict_types = 1);

namespace app\common\util;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\facade\Config;

class JwtUtil
{
    // 生成 JWT Token
    public static function generateToken($userId, $role = 'user')
    {
        $key = Config::get('jwt.key'); // 从配置文件中获取密钥
        $payload = [
            'iss' => Config::get('jwt.issuer'), // 签发者
            'aud' => Config::get('jwt.audience'), // 接收者
            'iat' => time(), // 签发时间
            'exp' => time() + Config::get('jwt.expire'), // 过期时间
            'user_id' => $userId, // 用户id
            'role' => $role
        ];

        return JWT::encode($payload, $key, 'HS256');
    }

    // 验证 JWT Token
    public static function validateToken($token)
    {
        $key = Config::get('jwt.key'); // 从配置文件中获取密钥
        try {
            $decoded = JWT::decode($token, new Key($key, 'HS256'));
            return (array) $decoded;
        } catch (\Exception $e) {
            return false; // Token 无效
        }
    }

    // 刷新 JWT Token
    public static function refreshToken($token)
    {
        $payload = self::validateToken($token);
        if (!$payload) {
            return false;
        }

        // 如果 Token 即将过期（剩余时间小于一半），则刷新 Token
        $remainingTime = $payload['exp'] - time();
        if ($remainingTime < Config::get('jwt.expire') / 2) {
            return self::generateToken($payload['user_id']);
        }

        return $token; // 无需刷新
    }
}